import axios from "axios"
import { ElMessage } from 'element-plus'
import { CODE_SUCCESS, CODE_FAIL, CODE_TOKEN_ERROR, CODE_KEY, MESSAGE_KEY, TOKEN_KEY } from "../api/params"
import store from "@/store"

// 会在网址后加上 /api/  ==> http://localhost:3000 -> http://localhost:3000/api
const BASE_URL = '/api'

const service = axios.create({
  baseURL: BASE_URL, // 通过 代理 http://localhost:3000/api -> http://localhost:3000/(target)
  timeout: 300000
});

// 添加请求拦截器
service.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // console.log("emit config : =>", config)
  // 用户正在登录
  if(store.getters.getUserInfo.username){
    // token 为空
    // console.log("getToken =>", localStorage.getItem(TOKEN_KEY))
    if(!store.getters.getToken){
      // 删除 store 与 LocalStorage 用户数据
      store.commit("logout");
      // 取消请求
      // console.log("Test cancel Request")
      return Promise.reject({[CODE_KEY]: CODE_FAIL, [MESSAGE_KEY]: "取消请求"});
    }
    // 不为空, 返回值加入 token
    else {
      config.headers.token = store.getters.getToken;
    }
    
    // console.log("Before Request, username has: true")
  } else {
    // console.log("Before Request, username has: false")
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
service.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // 返回状态码 为 成功
  if(response.data[CODE_KEY] === CODE_SUCCESS){
    // 如果含有 token 
    if(response.data[TOKEN_KEY]) {
      store.commit("setToken", response.data[TOKEN_KEY]);
    }
    return response;
  } 
  // 返回状态码 为 失败
  else if ( response.data[CODE_KEY] === CODE_FAIL){
    // 提示错误 ///////////////////////////////////////////
    ElMessage.error(response.data[MESSAGE_KEY])
    // 返回 reject
    return Promise.reject(response)
  }
  // token 验证失败
  else if ( response.data[CODE_KEY] === CODE_TOKEN_ERROR) {
    // 清除登录信息
    ElMessage.error(response.data[MESSAGE_KEY])
    store.commit("logout");
  }
  // 都不是，没有返回码，直接返回
  return response;
}, function (error) {
  // 对响应错误做点什么
  // 打印，不返回信息
  // console.log("response error!!!")
  // return Promise.reject(error);
});

export default service